From 4066d7272e8931f588c974c42b3e18140defd9be Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Wed, 13 Jul 2005 08:36:38 +0000 Subject: [PATCH] Need to save and restore MSRs for VMX domains across context switches. Signed-off-by: Yunhong Jiang Signed-off-by: Jun Nakajima Signed-off-by: Arun Sharma --- xen/arch/x86/domain.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index acf7d89343..609822d40a 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -643,6 +643,10 @@ static void load_segments(struct vcpu *p, struct vcpu *n) static void save_segments(struct vcpu *v) { struct cpu_user_regs *regs = &v->arch.guest_context.user_regs; + + if ( VMX_DOMAIN(v) ) + rdmsrl(MSR_SHADOW_GS_BASE, v->arch.arch_vmx.msr_content.shadow_gs); + __asm__ __volatile__ ( "movl %%ds,%0" : "=m" (regs->ds) ); __asm__ __volatile__ ( "movl %%es,%0" : "=m" (regs->es) ); __asm__ __volatile__ ( "movl %%fs,%0" : "=m" (regs->fs) ); @@ -791,7 +795,11 @@ void context_switch(struct vcpu *prev, struct vcpu *next) local_irq_enable(); - if ( !VMX_DOMAIN(next) ) + if ( VMX_DOMAIN(next) ) + { + vmx_restore_msrs(next); + } + else { load_LDT(next); load_segments(realprev, next); -- 2.30.2